<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Metodología de la Programación II: Fichero Fuente src/mp2gzip.cpp</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generado por Doxygen 1.5.5 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="main.html"><span>Página&nbsp;principal</span></a></li>
      <li><a href="classes.html"><span>Clases</span></a></li>
      <li class="current"><a href="files.html"><span>Archivos</span></a></li>
    </ul>
  </div>
<h1>src/mp2gzip.cpp</h1><a href="mp2gzip_8cpp.html">Ir a la documentación de este archivo.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
<a name="l00008"></a>00008 <span class="preprocessor">#include &lt;iostream&gt;</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include &lt;fstream&gt;</span>
<a name="l00010"></a>00010 <span class="preprocessor">#include &lt;TablaLongitud.h&gt;</span>
<a name="l00011"></a>00011 <span class="preprocessor">#include &lt;<a class="code" href="TablaDistancia_8h.html" title="Interfaz para trabajar con la tabla de bits adicionales para la codificación de...">TablaDistancia.h</a>&gt;</span>
<a name="l00012"></a>00012 <span class="preprocessor">#include &lt;<a class="code" href="VectorBits_8h.html" title="Interfaz para trabajar con vectores de bits.">VectorBits.h</a>&gt;</span>
<a name="l00013"></a>00013 <span class="preprocessor">#include &lt;<a class="code" href="TablaHuffmanD_8h.html" title="Interfaz para para trabajar con la tabla de bits adicionales para la codificación...">TablaHuffmanD.h</a>&gt;</span>
<a name="l00014"></a>00014 <span class="preprocessor">#include &lt;<a class="code" href="TablaHuffmanLC_8h.html" title="Interfaz para trabajar con la tabla de bits adicionales para la codificación de...">TablaHuffmanLC.h</a>&gt;</span>
<a name="l00015"></a>00015 <span class="preprocessor">#include &lt;<a class="code" href="crc_8h.html" title="Interfaz para calcular el crc de un texto.">crc.h</a>&gt;</span>
<a name="l00016"></a>00016 <span class="preprocessor">#include &lt;<a class="code" href="LZcoder_8h.html" title="Interfaz para comprimir un texto con el algoritmo LZ77.">LZcoder.h</a>&gt;</span>
<a name="l00017"></a>00017 
<a name="l00018"></a>00018 <span class="keyword">using namespace </span>std;
<a name="l00019"></a>00019 
<a name="l00020"></a>00020 <span class="comment">//El programa recibe desde la linea de ordenes (opcionalmente -mejor) el nombre del archivo a comprimir (opcionalmente el nombre destino)</span>
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> * argv[])
<a name="l00023"></a>00023 {
<a name="l00024"></a>00024         <span class="comment">//El minimo de argumentos 2 y el maximo 4</span>
<a name="l00025"></a>00025         <span class="keywordflow">if</span> (argc != 2 &amp;&amp; argc != 3 &amp;&amp; argc != 4)
<a name="l00026"></a>00026         {
<a name="l00027"></a>00027                 cerr &lt;&lt; <span class="stringliteral">"El numero de argumentos no es correcto"</span> &lt;&lt; endl;
<a name="l00028"></a>00028                 <span class="keywordflow">return</span> -1;
<a name="l00029"></a>00029         }
<a name="l00030"></a>00030         
<a name="l00031"></a>00031         <span class="comment">//Declaracion de variables</span>
<a name="l00032"></a>00032 
<a name="l00033"></a>00033         <a class="code" href="classTablaLongitud.html" title="Modulo que representa una tabla de codificación de bits adiccionales de longitudes...">TablaLongitud</a> tl;
<a name="l00034"></a>00034         <a class="code" href="classTablaDistancia.html" title="Modulo que representa una tabla de codificación de bits adiccionales de distancias...">TablaDistancia</a> td;
<a name="l00035"></a>00035         <a class="code" href="classTablaHuffmanD.html" title="Modulo que representa una tabla de codificación de bits adiccionales de distancias...">TablaHuffmanD</a> hd;
<a name="l00036"></a>00036         <a class="code" href="classTablaHuffmanLC.html" title="Modulo que representa una tabla de codificación de bits adiccionales de longitudes...">TablaHuffmanLC</a> hl;
<a name="l00037"></a>00037         <a class="code" href="classVectorBits.html" title="Modulo que representa un vector de bits.">VectorBits</a> v;
<a name="l00038"></a>00038         <a class="code" href="classLZcoder.html" title="Modulo que representa al algoritmo LZ77 de compresión.">LZcoder</a> coder;
<a name="l00039"></a>00039 
<a name="l00040"></a>00040         <span class="comment">//Preparacion de los argumentos de entrada</span>
<a name="l00041"></a>00041 
<a name="l00042"></a>00042         <span class="keywordtype">bool</span> mejor=<span class="keyword">false</span>;
<a name="l00043"></a>00043         <span class="keywordtype">char</span> * ent=0;
<a name="l00044"></a>00044         <span class="keywordtype">char</span> * sal=0;
<a name="l00045"></a>00045         <span class="comment">//Si se pone como argumento -mejor el fichero de entrada es argv[2] y el fichero de salida es argv[3]</span>
<a name="l00046"></a>00046         <span class="keywordflow">if</span> ( ! strcmp(argv[1],<span class="stringliteral">"-mejor"</span>) )
<a name="l00047"></a>00047         {
<a name="l00048"></a>00048                 mejor=<span class="keyword">true</span>;
<a name="l00049"></a>00049                 ent = <span class="keyword">new</span> <span class="keywordtype">char</span> [strlen(argv[2]) +1];
<a name="l00050"></a>00050                 strcpy (ent,argv[2]);
<a name="l00051"></a>00051                 <span class="keywordflow">if</span> (argc == 4)
<a name="l00052"></a>00052                 {
<a name="l00053"></a>00053                         sal = <span class="keyword">new</span> <span class="keywordtype">char</span> [strlen(argv[3])+1];
<a name="l00054"></a>00054                         strcpy(sal,argv[3]);
<a name="l00055"></a>00055                 }
<a name="l00056"></a>00056                 <span class="keywordflow">else</span> sal=0;
<a name="l00057"></a>00057         }
<a name="l00058"></a>00058         <span class="comment">//Si no se pone ese argumento el fichero de entrada es argv[1] y el fichero de salida es argv[2]</span>
<a name="l00059"></a>00059         <span class="keywordflow">else</span>
<a name="l00060"></a>00060         {
<a name="l00061"></a>00061                 ent = <span class="keyword">new</span> <span class="keywordtype">char</span> [strlen(argv[1]) +1];
<a name="l00062"></a>00062                 strcpy (ent,argv[1]);
<a name="l00063"></a>00063                 <span class="keywordflow">if</span> (argc == 3)
<a name="l00064"></a>00064                 {
<a name="l00065"></a>00065                         sal = <span class="keyword">new</span> <span class="keywordtype">char</span> [strlen(argv[2])+1];
<a name="l00066"></a>00066                         strcpy(sal,argv[2]);
<a name="l00067"></a>00067                 }
<a name="l00068"></a>00068                 <span class="keywordflow">else</span> sal=0;
<a name="l00069"></a>00069         }
<a name="l00070"></a>00070 
<a name="l00071"></a>00071         <span class="comment">//Inicializamos la variable f (fichero de entrada) con ent</span>
<a name="l00072"></a>00072         ifstream f(ent);
<a name="l00073"></a>00073         <span class="keywordflow">if</span> ( !f ) <span class="comment">//Si el fichero no lo hemos podido cargar bien...</span>
<a name="l00074"></a>00074         {
<a name="l00075"></a>00075                 cerr &lt;&lt; <span class="stringliteral">"El fichero no se pudo abrir"</span> &lt;&lt; endl;
<a name="l00076"></a>00076                 <span class="keywordflow">return</span> -1; <span class="comment">//... el programa acaba</span>
<a name="l00077"></a>00077         }
<a name="l00078"></a>00078         <span class="comment">//Declaramos la variable fs (fichero de salida)</span>
<a name="l00079"></a>00079         ofstream fs;
<a name="l00080"></a>00080         <span class="keywordflow">if</span> (sal != 0) <span class="comment">//Si se ha indicado el nombre destino...</span>
<a name="l00081"></a>00081         {
<a name="l00082"></a>00082                 fs.open(sal); <span class="comment">//inicializamos la variable fs con sal</span>
<a name="l00083"></a>00083                 <span class="keywordflow">if</span> ( !fs ) <span class="comment">//Si hay algun problema con el fichero...</span>
<a name="l00084"></a>00084                 {
<a name="l00085"></a>00085                         cerr &lt;&lt; <span class="stringliteral">"Fichero de  salida no se puede abrir"</span> &lt;&lt; endl;
<a name="l00086"></a>00086                         <span class="keywordflow">return</span> -1; <span class="comment">//... el programa acaba</span>
<a name="l00087"></a>00087                 }
<a name="l00088"></a>00088         }
<a name="l00089"></a>00089         <span class="keywordflow">else</span> <span class="comment">//Le ponemos como nombre de destino el mismo que la entrada pero acabado en .gz</span>
<a name="l00090"></a>00090         {
<a name="l00091"></a>00091                 <span class="keywordtype">int</span> tam = strlen(ent);
<a name="l00092"></a>00092                 <span class="keywordtype">char</span> * salida = <span class="keyword">new</span> <span class="keywordtype">char</span> [tam+4];
<a name="l00093"></a>00093                 strcpy(salida, ent);
<a name="l00094"></a>00094                 strcat(salida,<span class="stringliteral">".gz"</span>);
<a name="l00095"></a>00095                 fs.open(salida); <span class="comment">//inicializamos la variable fs con salida</span>
<a name="l00096"></a>00096                 <span class="keyword">delete</span> [] salida;
<a name="l00097"></a>00097                 <span class="keywordflow">if</span> ( !fs ) <span class="comment">//Si hay algún problema con el fichero...</span>
<a name="l00098"></a>00098                 {
<a name="l00099"></a>00099                         cerr &lt;&lt; <span class="stringliteral">"Fichero de  salida no se puede abrir"</span> &lt;&lt; endl;
<a name="l00100"></a>00100                         <span class="keywordflow">return</span> -1; <span class="comment">//... el programa acaba</span>
<a name="l00101"></a>00101                 }
<a name="l00102"></a>00102 
<a name="l00103"></a>00103         }
<a name="l00104"></a>00104 
<a name="l00105"></a>00105         <span class="comment">// Cabecera de fichero</span>
<a name="l00106"></a>00106         <span class="keywordtype">char</span> cabecera[] = {0x1F,0x8B,0x08,0x18,0x00,0x00,0x00,0x00,0x04,0xFF};
<a name="l00107"></a>00107         fs.write(cabecera,10);
<a name="l00108"></a>00108         <span class="comment">// Nombre del fichero original</span>
<a name="l00109"></a>00109         fs.write(ent,strlen(ent)+1);
<a name="l00110"></a>00110         <span class="comment">// Comentario (nombre del alumno y su DNI)</span>
<a name="l00111"></a>00111         <span class="keywordtype">char</span> nombre[] = <span class="stringliteral">"Mary Suarez Machado 76626643-G"</span>;
<a name="l00112"></a>00112         fs.write(nombre,strlen(nombre)+1);
<a name="l00113"></a>00113         <span class="comment">// Cabecera compuesta por los bits 110</span>
<a name="l00114"></a>00114         v += 1;
<a name="l00115"></a>00115         v += 1;
<a name="l00116"></a>00116         v += 0;
<a name="l00117"></a>00117         <span class="comment">//Lectura del fichero</span>
<a name="l00118"></a>00118         coder.<a class="code" href="classLZcoder.html#6bd9cb5f2dad8246d13da7e929055fee" title="Lee datos.">Leer</a>(f);
<a name="l00119"></a>00119 
<a name="l00120"></a>00120         <span class="keywordtype">int</span> dato = 0;
<a name="l00121"></a>00121         <span class="comment">//Compresión del fichero</span>
<a name="l00122"></a>00122         <span class="keywordflow">while</span> (dato != 256)
<a name="l00123"></a>00123         {
<a name="l00124"></a>00124                 <span class="keywordflow">if</span> (mejor == <span class="keyword">true</span>)
<a name="l00125"></a>00125                         dato = coder.<a class="code" href="classLZcoder.html#2170c081cc9e7726fb2aa9215788f522" title="Calcula el siguiente codigo de la cadena buscando la cadena mas larga.">SiguienteCodigoMejor</a>(); <span class="comment">//Utiliza el algoritmo mejorado</span>
<a name="l00126"></a>00126                 <span class="keywordflow">else</span>    dato = coder.<a class="code" href="classLZcoder.html#54885f3096730720b85eca1b13694106" title="Calcula el siguiente codigo de la cadena.">SiguienteCodigo</a>(); <span class="comment">//Utiliza el normal</span>
<a name="l00127"></a>00127                 <span class="keywordflow">if</span> (dato &lt;= 256){
<a name="l00128"></a>00128                         <a class="code" href="classVectorBits.html" title="Modulo que representa un vector de bits.">VectorBits</a> ve;
<a name="l00129"></a>00129                         ve=hl.<a class="code" href="classTablaHuffmanLC.html#4b815239d1e7cb6e385c7ddb621101e0">GetCodificacion</a>(dato);
<a name="l00130"></a>00130                         v += hl.<a class="code" href="classTablaHuffmanLC.html#4b815239d1e7cb6e385c7ddb621101e0">GetCodificacion</a>(dato);
<a name="l00131"></a>00131                 }
<a name="l00132"></a>00132                 <span class="keywordflow">if</span> (dato &gt; 256)
<a name="l00133"></a>00133                 {
<a name="l00134"></a>00134                         <span class="keywordtype">int</span> cod = tl.<a class="code" href="classTablaLongitud.html#e5d59237712a35ccafb3d8c4dba20ddb">GetCodigo</a>(dato-256);
<a name="l00135"></a>00135                         v += hl.<a class="code" href="classTablaHuffmanLC.html#4b815239d1e7cb6e385c7ddb621101e0">GetCodificacion</a>(cod);
<a name="l00136"></a>00136                         v += tl.<a class="code" href="classTablaLongitud.html#ee77389e93e00e9e4fa04e3c651b4dd0">GetBitsAdicionales</a>(dato-256);
<a name="l00137"></a>00137                         <span class="keywordtype">int</span> dis = coder.<a class="code" href="classLZcoder.html#acb2e0ee6ae1623554b60b9712c601b2">GetDistancia</a>();
<a name="l00138"></a>00138                         <span class="keywordtype">int</span> cod_dist = td.<a class="code" href="classTablaDistancia.html#399b6d7e82fd072b6a4c035eaef5437d">GetCodigo</a>(dis);
<a name="l00139"></a>00139                         v += hd.<a class="code" href="classTablaHuffmanD.html#3280691c456a3fe1844db1b435648c65">GetCodificacion</a>(cod_dist);
<a name="l00140"></a>00140                         v += td.<a class="code" href="classTablaDistancia.html#9305d47f4bacf81843e0417457219484">GetBitsAdicionales</a>(dis);
<a name="l00141"></a>00141                 }
<a name="l00142"></a>00142         }
<a name="l00143"></a>00143         <span class="comment">//Escritura en el fichero de salida todo el fichero de entrada comprimido</span>
<a name="l00144"></a>00144         v.<a class="code" href="classVectorBits.html#ae8e4a406766c929a614359d5646c813" title="función que salva los datos en bytes">Salvar</a>(fs);
<a name="l00145"></a>00145 
<a name="l00146"></a>00146         <span class="comment">//Calculo del crc32 (fichero sin comprimir)</span>
<a name="l00147"></a>00147         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> crc = coder.<a class="code" href="classLZcoder.html#f2fc72da4d2546cdb4e5f7dbd11a05c7" title="Calculo del crc32.">GetParidad</a>();
<a name="l00148"></a>00148         <span class="comment">//Calculo del tamaño del fichero sin comprimir</span>
<a name="l00149"></a>00149         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> tam = coder.<a class="code" href="classLZcoder.html#0489c25c1202e211dd56c09b39353d3d">GetTamano</a>();
<a name="l00150"></a>00150 
<a name="l00151"></a>00151         <span class="comment">//Escritura del crc32</span>
<a name="l00152"></a>00152         fs.write( (<span class="keywordtype">char</span>*)&amp;crc, 4);      
<a name="l00153"></a>00153         <span class="comment">//Escritura del tamaño del fichero sin comprimir</span>
<a name="l00154"></a>00154         fs.write( (<span class="keywordtype">char</span>*)&amp;tam, 4);      
<a name="l00155"></a>00155 }
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generado el Thu Jun 10 12:36:12 2010 para Metodología de la Programación II por&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.5 </small></address>
</body>
</html>
